#include "stm32f10x.h"                  // Device header
#include "Delay.h"

#define I2C_SCL GPIO_Pin_10
#define I2C_SDA GPIO_Pin_11

void MyI2C_W_SCL(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB,I2C_SCL,(BitAction)BitValue);
	Delay_us(10);
}

void MyI2C_W_SDA(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB,I2C_SDA,(BitAction)BitValue);
	Delay_us(10);
}

uint8_t MyI2C_R_SDA()
{
	uint8_t BitValue;
	BitValue = GPIO_ReadInputDataBit(GPIOB,I2C_SDA);
	Delay_us(10);
	return BitValue;
}
void MyI2C_Init()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;							//开漏输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;							//速度
	GPIO_InitStructure.GPIO_Pin = I2C_SCL | I2C_SDA;			//IO口PB10和PB11
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
}

void MyI2C_Start()
{
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	MyI2C_W_SDA(0);
	MyI2C_W_SCL(0);
}

void MyI2C_Stop()
{
	MyI2C_W_SDA(0);
	MyI2C_W_SCL(1);
	MyI2C_W_SDA(1);
}

void MyI2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for(i = 0;i<8;i++)
  {
		MyI2C_W_SDA(Byte & (0x80 >> i));
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);
  }
}

uint8_t MyI2C_ReceiveByte()
{
	uint8_t i, Byte = 0x00;
	MyI2C_W_SDA(1);
	for(i = 0;i<8;i++)
  {
		MyI2C_W_SCL(1);
		if(MyI2C_R_SDA() == 1) Byte |= (0x80 >> i);
		MyI2C_W_SCL(0);
  }
	return Byte;
}

void MyI2C_SendAck(uint8_t Byte)
{
	MyI2C_W_SDA(Byte);
	MyI2C_W_SCL(1);
	MyI2C_W_SCL(0);
}

uint8_t MyI2C_ReceiveAck()
{
	uint8_t AckBit;
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	AckBit = MyI2C_R_SDA(); 
	MyI2C_W_SCL(0);
	return AckBit;
}